package malha;

/**
 * Um elemento da malha ferroviaria. Pode ser uma chave (CChave) ou um trecho do trilho (CTrecho)
 * @author Marcel
 * 
 */
public abstract class CElementoTrilho {

	private String id;
	private float distancia;
	protected CElementoTrilho elementoAtualA;
	protected CElementoTrilho elementoAtualB;
	
	
	/**
	 * Construtor com ID
	 */
	public CElementoTrilho(String id) {
		this.id = id;
	}
	
	
	/**
	 * @return Uma String que identifica este elemento exclusivamente 
	 */
	public String getId() {
		return id;
	}
	
	/**
	 * @param novaDistancia the distancia to set
	 * 
	 * @pre A distancia deve ser positiva
	 * @post O atributo distancia deve ser stado
	 */
	public void setDistancia(float novaDistancia) {
		
		assert(novaDistancia > 0);
		
		this.distancia = novaDistancia;
	}

	/**
	 * @return the distancia
	 */
	public float getDistancia() {
		return distancia;
	}
	
	/**
	 * @return A chave ou trecho ligado na extremidade A deste elemento
	 */
	public CElementoTrilho getElementoAtualA() {
		return elementoAtualA;
	}
	
	/**
	 * @return A chave ou trecho ligado na extremidade B deste elemento
	 */
	public CElementoTrilho getElementoAtualB() {
		return elementoAtualB;
	}
	
	/**
	 * Funcao abstrata utilizada para setar o componente no lado a deste elemento 
	 */
	public abstract void setElementoAtualA(CElementoTrilho novoElemento, boolean inicializandoMalha);	
	public abstract void setElementoAtualB(CElementoTrilho novoElemento, boolean inicializandoMalha);
	
	/**
	 * Compara dois objetos
	 * 
	 * @param o Objeto a ser comparado
	 * @return True se os objetos tiverem o mesmo ID
	 */
	public boolean equals(Object o) {
		if (o instanceof CElementoTrilho) {
			CElementoTrilho temp = (CElementoTrilho) o;
			return temp.getId().equals(this.getId());
		} else {
			return false;
		}
	}
	
	
	@Override
	public String toString() {
		String id = "ID: " + this.getId();
		
		String elemA = " | elemA: ";
		if (this.getElementoAtualA() == null) {
			elemA += "null";
		} else {
			elemA += this.getElementoAtualA().getId();
		}
		
		String elemB = " | elemB: ";
		if (this.getElementoAtualB() == null) {
			elemB += "null";
		} else {
			elemB += this.getElementoAtualB().getId();
		}
		
		return id + elemA + elemB;
	}
}
